package com.test.environment;

import com.test.source.MapPropertySource;
import java.util.Map;

/**
 * SystemEnvironmentPropertySource类继承自MapPropertySource，用于从系统环境变量中获取属性
 * 它通过各种策略解析键名，以尝试在系统属性中找到匹配项
 */
public class SystemEnvironmentPropertySource extends MapPropertySource {
    /**
     * 构造一个新的MapPropertySource实例
     *
     * @param name   属性源的名称，用于标识属性源
     * @param source 属性源的数据，存储键值对形式的属性
     */
    public SystemEnvironmentPropertySource(String name, Map<String, Object> source) {
        super(name, source);
    }

    /**
     * 重写getProperty方法，通过解析键名来获取系统属性
     *
     * @param name 属性名，用于查找属性值
     * @return 属性值，如果找不到则返回null
     */
    public Object getProperty(String name) {
        String actualKey = resolveKey(name);
        if (actualKey == null){
            return null;
        }
        return System.getProperty(actualKey);
    }

    /**
     * 检查属性源是否包含指定名称的属性
     *
     * @param name 要检查的属性名
     * @return 如果包含指定名称的属性则返回true，否则返回false
     */
    @Override
    public boolean containsProperty(String name) {
        String actualKey = resolveKey(name);
        return actualKey != null && super.containsProperty(actualKey);
    }

    /**
     * 解析键名，以适应系统环境变量的命名约定
     * 它尝试原始键名、全大写键名、使用下划线替换点和使用下划线替换中横线的键名
     *
     * @param name 原始属性名
     * @return 解析后的键名，如果找不到匹配项则返回null
     */
    private String resolveKey(String name) {
        if (super.containsProperty(name)){
            return name;
        }

        String upperCaseName = name.toUpperCase();
        if (super.containsProperty(upperCaseName)){
            return upperCaseName;
        }

        String withUnderscores = name.replace('.', '_');
        if (super.containsProperty(withUnderscores)){
            return withUnderscores;
        }

        String withUnderscoresForDashes = withUnderscores.replace('-', '_');
        if (super.containsProperty(withUnderscoresForDashes)){
            return withUnderscoresForDashes;
        }

        return null;
    }
}
